package com.ruoyi.eqmonitor.service;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.eqmonitor.domain.OptDevice;
import com.ruoyi.eqmonitor.domain.OptDeviceAndRelation;
import com.ruoyi.eqmonitor.domain.OptDeviceRelation;
import com.ruoyi.eqmonitor.dtos.*;
import com.ruoyi.eqmonitor.utils.Constant;
import com.ruoyi.eqmonitor.vo.OptDeviceVo;

/**
 * @author ruoyi
 * @date 2022-11-25
 */
public interface IOptDeviceService extends IService<OptDevice>{

    public boolean refreshCache();

    public OptDeviceDto selectOptDeviceById(Long id);

    public OptDeviceRelation getDeviceAndRelation(Long id);

    public List<OptDeviceDto> selectOptDeviceList(OptDeviceDto optDevice);

    /**
     * 根据设备编码获取设备数据
     * @param code 设备编码
     */
    public OptDeviceDto getDeviceByCode(String code);
    /**
     * 根据真实设备编码获取设备数据 -- 一般只会在恒星物联订阅设备时使用
     * @param code 设备编码
     */
    public OptDeviceDto getDeviceByRealCode(String code);

    int saveDevice(OptDevice optDevice);

    /**
     * 新增设备和设备关联关系
     */
    int saveDeviceAndRelation(OptDeviceAndRelation deviceAndRelation);

    int updateDeviceById(OptDevice optDevice);

    /**
     * 修改设备和设备关联关系
     */
    int updateDeviceAndRelation(OptDeviceAndRelation deviceAndRelation);

    int deleteDevice(List<Long> ids);

    /**
     * 查询指定设备编码重复出现的次数 传入id则过滤id不为此值的设备编码
     * @param deviceCode 设备编码
     * @param id 不包含的id
     * @return 出现次数
     */
    public long getDeviceCodeCount(String deviceCode, Long id);
//
//    long getDeviceTypeCount(String name,List<String> deviceTypes);

    public long getRealDeviceCodeCount(String realDeviceCode, Long id);

    public List<OptDeviceQuantityCountDto> selectOptDeviceQuantity(AlarmSearchInput inputs);

    public List<OptDeviceAndAlarmCountDto> selectOptDeviceAlarmQuantity(AlarmSearchInput inputs);

    /**
     * 获取泵站周边的流量设备
     */
    public List<OptDeviceDto> getBzFlowDevice();

    /**
     * 查询泵站周边的设备
     */
    public List<OptDeviceDto> selectPumpStationDeviceList(List<String> deviceTypes);

    /**
     * 查询设备信息以及最后在线时间
     * @param optDeviceDto 设备实体
     * @return 设备列表
     */
    public List<OptDeviceDto> selectOptDeviceListAndLastTime(OptDeviceDto optDeviceDto);

    List<OptDeviceDto> getByDeviceType(Integer state,List<String> siteNames);

    List<OptDeviceDto> getByDeviceTypes(OptDeviceDto optDeviceDto);

    List<StreetAlarmResultDto> selectStreetAlarm(AlarmSearchInput inputs);

    List<StreetAlarmResultDto> selectStreetSubAlarm(AlarmSearchInput inputs);

    Map<String,List<OptDeviceVo>> getAll(Integer state);

    List<OptDeviceDto> selectOnOffLine(OnOffLineDto dto);

    public OptDevice selectOptDeviceNewById(Long id);

    public List<OptDevice> selectOptDeviceNewList(OptDevice optDeviceNew);

//    boolean toLeadJSON(InputStream inputStream) throws Exception;

    Map<String,List<OptDevice>> getAll();

    List<OptDevice> backstageDeviceSum(Integer state, String areaName);

    /**
     * 统计个设备总数
     */
    List<Map<String, String>> mySelectCount(String areaName);

    List<OptPointDto> selectOptPointList();

    List<OptDeviceDto> selectOptDeviceListBySiteId(String siteId, List<String> sensorTypeList);

    int countBySensorType(String s);

    JSONObject getCountJson(String s);

    List<OptDeviceDto> selectOnOffLineBySensorType(OnOffLineDto dtoOnline);

    List<OptDevice> listByDeviceType(String deviceType);
}
